<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <title>Java 内存模型及GC原理 - IT-Homer
        - 博客频道 - CSDN.NET</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="description" content="一个优秀Java程序员，必须了解Java内存模型、GC工作原理，以及如何优化GC的性能、与GC进行有限的交互，有一些应用程序对性能要求较高，例如嵌入式系统、实时系统等，只有全面提升内存的管理效率，才能提高整个应用程序的性能。本文将从JVM内存模型、GC工作原理，以及GC的几个关键问题进行探讨，从GC角度提高Java程序的性能。一、Java内存模型按照官方的说法：Java 虚拟机具有一个堆，堆是运行" />
    <script src="http://static.blog.csdn.net/scripts/jquery.js" type="text/javascript"></script>
    <script type="text/javascript" src="http://static.blog.csdn.net/scripts/ad.js?v=1.1"></script>
        <!--new top-->
               <link rel="stylesheet" href="http://static.csdn.net/public/common/toolbar/css/index.css">        <!--new top-->

    <link rel="Stylesheet" type="text/css" href="http://static.blog.csdn.net/skin/light_blue/css/style.css?v=1.1" />
    <link id="RSSLink" title="RSS" type="application/rss+xml" rel="alternate" href="/sunboy_2050/rss/list" />
    <link rel="shortcut icon" href="/favicon.ico" />
    <link type="text/css" rel="stylesheet" href="http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/blue_green.css" />
 

</head>
<body>
    
   
      <!--new top-->
    <script id="toolbar-tpl-scriptId" fixed="true" prod="blog" skin="black" src="http://static.csdn.net/public/common/toolbar/js/html.js" type="text/javascript"></script>
     <!--new top-->
    <div id="container">
        <div id="header">
    <div class="header">
        <div id="blog_title">
            <h2>
                <a href="http://blog.csdn.net/ithomer">IT-Homer</a></h2>
            <h3>本博客将逐渐停止更新，感谢大家的支持，我的新博客： http://blog.ithomer.net</h3>
            <div class="clear">
            </div>
        </div>
        <div class="clear">
        </div>
    </div>
</div>
<div id="navigator">
    <div class="navigator_bg">
    </div>
    <div class="navigator">
        <ul>
                <li id="btnContents"><a href="http://blog.csdn.net/ithomer?viewmode=contents"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_mulu'])">
                    <img src="http://static.blog.csdn.net/images/ico_list.gif">目录视图</span></a></li>
                <li id="btnView"><a href="http://blog.csdn.net/ithomer?viewmode=list"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_zhaiyao'])">
                    <img src="http://static.blog.csdn.net/images/ico_summary.gif">摘要视图</span></a></li>
                <li id="btnRss"><a href="http://blog.csdn.net/ithomer/rss/list"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_RSS'])">
                    <img src="http://static.blog.csdn.net/images/ico_rss.gif">订阅</span></a></li>
</ul>
    </div>
</div>
<script type="text/javascript">
    var username = "sunboy_2050";
    var _blogger = username;
    var blog_address = "http://blog.csdn.net/ithomer";
    var static_host = "http://static.blog.csdn.net";
    var currentUserName = "";
</script>

        <div id="body">
            <div id="main">
                <div class="main">
<div class="notice tracking-ad" data-mod='popu_3' > 


<a href="http://hero.csdn.net/Question/Details?ID=351&ExamID=346" target="_blank"><font color=blue>英雄会第四届在线编程大赛·线上初赛：带通配符的数
</font></a>

&nbsp;&nbsp;&nbsp;&nbsp;


<a href="http://bbs.csdn.net/topics/390724670"target="_blank">
<font color=red>CSDN社区“三八节”特别活动</font></a>
&nbsp;&nbsp;&nbsp;&nbsp;


<a href="http://www.csdn.net/article/2014-03-06/2818653"target="_blank">
<font color=blue>开发者职业生涯调查之未来</font></a>




</div>                    <link href="http://static.blog.csdn.net/css/comment1.css" type="text/css" rel="stylesheet" />
<link href="http://static.blog.csdn.net/css/style1.css" type="text/css" rel="stylesheet" />
<div id="article_details" class="details">
    <div class="article_title">
    <span class="ico ico_type_Original"></span>
    <h1>
        <span class="link_title"><a href="/ithomer/article/details/6252552">
        Java 内存模型及GC原理
        </a></span>
    </h1>
</div>

    <div class="article_manage">
        <span class="link_categories">
        分类：
            <a href="/sunboy_2050/article/category/730435" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Java/JSP</a> 
        </span>
    <span class="link_postdate">2011-03-16 09:58</span>
    <span class="link_view" title="阅读次数">6098人阅读</span>
    <span class="link_comments" title="评论次数"><a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(2)</span>
    <span class="link_collect"><a href="javascript:void(0);" onclick="javascript:_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shoucang']);collectArticle('Java 内存模型及GC原理','6252552');return false;" title="收藏">收藏</a></span>
    <span class="link_report"><a href="#report"  onclick="javascript:_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_jubao']);report(6252552,2);return false;" title="举报">举报</a></span>
    
</div>
<div class="tag2box"><a href='http://www.csdn.net/tag/jdk' target=_blank onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">jdk</a><a href='http://www.csdn.net/tag/jvm' target=_blank onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">jvm</a><a href='http://www.csdn.net/tag/java' target=_blank onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">java</a><a href='http://www.csdn.net/tag/server' target=_blank onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">server</a><a href='http://www.csdn.net/tag/exception' target=_blank onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">exception</a></div>

    
<div id="article_content" class="article_content">
<p><span style="font-family: 宋体; line-height: 25px; text-align: left; ">一个优秀</span><span style="font-family: 宋体;  text-align: left; line-height: 22px; ">Java</span><span style="font-family: 宋体; line-height: 25px; text-align: left; ">程序员，必须了解Java内存模型、GC工作原理，以及如何优化GC的性能、与GC进行有限的交互，有一些应用程序对性能要求较高，例如</span><span style="font-family:宋体;"><span style=" text-align: left; line-height: 22px;">嵌入式</span></span><span style="font-family: 宋体; line-height: 25px; text-align: left; ">系统、实时系统等，只有全面提升内存的管理效率，才能提高整个应用程序的性能。</span></p><p><span style="font-family: 宋体; line-height: 25px; text-align: left; ">本文将从JVM内存模型、GC工作原理，以及GC的几个关键问题进行探讨，</span><span style="font-family: 宋体; line-height: 25px; text-align: left; ">从GC角度提高Java程序的性能。</span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体;  line-height: 25px; text-align: left; "><strong>一、Java内存模型</strong></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; text-align: left; "></p><p style="font-family: Arial; line-height: 26px; text-align: left; "><span style="font-family: Arial, 宋体; font-size: 14px; line-height: 25px; ">按照官方的说法：Java 虚拟机具有一个堆，堆是运行时数据区域，所有类实例和数组的内存均从此处分配。</span></p><p style="font-family: Arial; line-height: 26px; text-align: left; "><span style="font-family: Arial, 宋体; font-size: 14px; line-height: 25px; "><span style="font-family: Arial, 宋体; font-size: 14px; line-height: 25px; text-align: left; ">JVM主要管理两种类型内存：堆和非堆，</span>堆内存（Heap<span style="font-family: Arial, 宋体; font-size: 14px; line-height: 25px; text-align: left; ">&nbsp;Memory</span>）是在 Java 虚拟机启动时创建，<span style="font-family: Arial, 宋体; font-size: 14px; line-height: 25px; text-align: left; ">非堆内存(Non-heap Memory)是</span>在JVM堆之外的内存。</span></p><p style="font-family: Arial; line-height: 26px; text-align: left; "><span style="font-family: Arial, 宋体; font-size: 14px; line-height: 25px; ">简单来说，堆是Java代码可及的内存，留给开发人员使用的；非堆是JVM留给自己用的，包含方法区、JVM内部处理或优化所需的内存（如&nbsp;<a target=_blank target="_blank" href="http://baike.baidu.com/view/112978.htm#10" style="color:blue;">JIT</a> Compiler，Just-in-time Compiler，即时<span style="font-family: Arial, 宋体; font-size: 14px; line-height: 25px; text-align: left; ">编译后的代码缓存</span>）、每个类结构（如运行时常数池、字段和方法数据）以及方法和构造方法的代码。</span><br /></p><p style="font-family: Arial; line-height: 26px; text-align: left; "><strong>JVM 内存包含如下几个部分：</strong></p><ul style="font-family: Arial; line-height: 26px; text-align: left; "><li>堆内存（Heap Memory）： 存放Java对象<br /></li><li>非堆内存（Non-Heap Memory）： 存放类加载信息和其它meta-data</li><li>其它（Other）： 存放JVM 自身代码等</li></ul><p style="color: rgb(51, 51, 51); font-family: Arial; line-height: 36px; text-align: left; "><img src="http://my.csdn.net/uploads/201205/05/1336185114_5623.png" alt="" /><br /></p><p style="font-family: Arial; line-height: 30px; text-align: left; ">在JVM启动时，就已经保留了固定的内存空间给Heap内存，这部分内存并不一定都会被JVM使用，但是可以确定的是这部分保留的内存不会被其他进程使用，这部分内存大小由<code><span style="color:#990000;">-Xmx</span><span style="color: rgb(0, 0, 255); ">&nbsp;</span>参数指定。</code>而另一部分内存在JVM启动时就分配给JVM，作为JVM的初始Heap内存使用，这部分内存是由&nbsp;<span style="color:#990000;">-Xms&nbsp;</span><span style="font-family: Arial; line-height: 30px; text-align: left; ">参数指定。</span></p><p><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><br /></span></span></p><p><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; ">详细配置文件目录：<span style="color:#ff0000;">eclipse/</span></span><span style="color:#ff0000;">eclipse.ini</span></span></p><p style="text-align: left;"><img src="http://my.csdn.net/uploads/201205/05/1336207559_1778.png" alt="" /><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "></span></p><p></p><p><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; ">默认空余堆内存小于40%时，JVM 就会增大堆直到-Xmx 的最大限制，可以由&nbsp;</span><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="color:#990000;">-XX:MinHeapFreeRatio</span></span><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; color: rgb(51, 51, 255); ">&nbsp;</span><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; ">指定。&nbsp;</span></p><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; ">默认空余堆内存大于70%时，JVM 会减少堆直到-Xms的最小限制，可以由&nbsp;</span><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="color:#990000;">-XX:MaxHeapFreeRatio</span></span><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; color: rgb(51, 51, 255); ">&nbsp;</span><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; ">指定，<a target=_blank target="_blank" href="http://hi.baidu.com/sunboy_2050/blog/item/b94352ec22e520dbb3fb951b.html" style="color:blue;">详见</a></span><p style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; ">可以通过&nbsp;<code><span style="color:#990000;">-XX:MaxPermSize</span><span style="color:#3333ff;">&nbsp;</span></code>设置Non-Heap大小，详细参见我的<a target=_blank target="_blank" href="http://hi.baidu.com/sunboy_2050/blog/item/b7ec14328ca6aeb9a8018e1d.html?timeStamp=1336206805693" style="color:blue;">百度博客</a></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><strong>二、Java内存分配</strong></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-size: 14px; text-align: left; "></p><p style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style=""><span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">Java的内存管理实际上就是<span style="color:#cc0000;">变量</span>和<span style="color:#cc0000;">对象</span>的管理，其中包括对象的分配和释放。</span><br /></span></p><p style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><img src="http://my.csdn.net/uploads/201205/05/1336185361_6442.png" alt="" style="font-family: 宋体; line-height: 25px; " /></p><p style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; ">JVM内存申请过程如下：</span></p><ol style="font-family: Arial; line-height: 26px; text-align: left; font-size: 14px; "><li><span style="font-size: 12px; ">JVM 会试图为相关Java对象在Eden中初始化一块内存区域</span></li><li><span style="font-size: 12px; ">当Eden空间足够时，内存申请结束；否则到下一步</span></li><li><span style="font-size: 12px; ">JVM 试图释放在Eden中所有不活跃的对象（这属于1或更高级的垃圾回收）,释放后若Eden空间仍然不足以放入新对象，则试图将部分Eden中活跃对象放入Survivor区</span></li><li><span style="font-size: 12px; ">Survivor区被用来作为Eden及OLD的中间交换区域，当OLD区空间足够时，Survivor区的对象会被移到Old区，否则会被保留在Survivor区</span></li><li><span style="font-size: 12px; ">当OLD区空间不够时，JVM 会在OLD区进行完全的垃圾收集（0级）</span></li><li><span style="font-size: 12px; ">完全垃圾收集后，若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象，导致JVM无法在Eden区为新对象创建内存区域，则出现”out of memory”<span style="font-family: Arial; line-height: 26px; text-align: left; ">错误</span></span></li></ol><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "><strong>三、GC基本原理</strong></span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">GC（Garbage Collection)，是JAVA/.NET中的垃圾收集器。<br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">Java是由C++发展来的，它摈弃了C++中一些繁琐容易出错的东西，引入了计数器的概念，其中有一条就是这个GC机制（C#借鉴了JAVA）<br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">编程人员容易出现问题的地方，忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃，Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的，Java语言没有提供释放已分配内存的显示操作方法。所以，Java的内存管理实际上就是对象的管理，其中包括对象的分配和释放。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">对于程序员来说，分配对象使用new关键字；释放对象时，只要将对象所有引用赋值为null，让程序不能够再访问到这个对象，我们称该对象为&quot;不可达的&quot;.GC将负责回收所有&quot;不可达&quot;对象的内存空间。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">对于GC来说，当程序员创建对象时，GC就开始监控这个对象的地址、大小以及使用情况。通常，GC采用有向图的方式记录和管理堆（heap）中的所有对象。通过这种方式确定哪些对象是&quot;可达的&quot;，哪些对象是&quot;不可达的&quot;.当GC确定一些对象为&quot;不可达&quot;时，GC就有责任回收这些内存空间。但是，为了保证 GC能够在不同平台实现的问题，Java规范对GC的很多行为都没有进行严格的规定。例如，对于采用什么类型的回收算法、什么时候进行回收等重要问题都没有明确的规定。因此，不同的JVM的实现者往往有不同的实现算法。这也给Java程序员的开发带来行多不确定性。本文研究了几个与GC工作相关的问题，努力减少这种不确定性给Java程序带来的负面影响。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><strong>四、GC分代划分</strong></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: Arial; line-height: 26px; text-align: left; ">JVM内存模型中Heap区分两大块，一块是 Young Generation，另一块是Old Generation</span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: Arial; line-height: 26px; "><img src="http://my.csdn.net/uploads/201205/05/1336185793_9775.jpg" alt="" /><br /></span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: Arial; line-height: 26px; text-align: left; ">1） 在Young&nbsp;Generation中，有一个叫Eden Space的空间，主要是用来存放新生的对象，还有两个Survivor Spaces（from、to），它们的大小总是一样，它们用来存放每次垃圾回收后存活下来的对象。</span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: Arial; line-height: 26px; text-align: left; ">2） 在Old Generation中，主要存放应用程序中生命周期长的内存对象。</span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: Arial; line-height: 26px; text-align: left; ">3） 在Young&nbsp;Generation块中，垃圾回收一般用Copying的算法，速度快。每次GC的时候，存活下来的对象首先由Eden拷贝到某个SurvivorSpace<span style="font-family: Arial; line-height: 25.99431800842285px;">，</span>当Survivor Space空间满了后<span style="font-family: Arial; line-height: 25.99431800842285px;">，</span>剩下的live对象就被直接拷贝到OldGeneration中去。因此，每次GC后，Eden内存块会被清空。</span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: Arial; line-height: 26px; text-align: left; ">4） 在Old Generation块中，垃圾回收一般用mark-compact的算法，速度慢些，但减少内存要求。</span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: Arial; line-height: 26px; text-align: left; ">5） 垃圾回收分多级，0级为全部(Full)的垃圾回收，会回收OLD段中的垃圾；1级或以上为部分垃圾回收，只会回收Young中的垃圾，内存溢出通常发生于OLD段或Perm段垃圾回收后，仍然无内存空间容纳新的Java对象的情况。</span><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "><strong>五、增量式GC</strong></span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">增量式GC（Incremental GC），是</span>GC在JVM中通常是由一个或一组进程来实现的，它本身也和用户程序一样占用heap空间，运行时也占用CPU。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">当GC进程运行时，应用程序停止运行。因此，当GC运行时间较长时，用户能够感到Java程序的停顿，另外一方面，如果GC运行时间太短，则可能对象回收率太低，这意味着还有很多应该回收的对象没有被回收，仍然占用大量内存。因此，在设计GC的时候，就必须在停顿时间和回收率之间进行权衡。一个好的GC实现允许用户定义自己所需要的设置，例如有些内存有限的设备，对内存的使用量非常敏感，希望GC能够准确的回收内存，它并不在意程序速度的快慢。另外一些实时网络游戏，就不能够允许程序有长时间的中断。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">增量式GC就是通过一定的回收算法，把一个长时间的中断，划分为很多个小的中断，通过这种方式减少GC对用户程序的影响。虽然，增量式GC在整体性能上可能不如普通GC的效率高，但是它能够减少程序的最长停顿时间。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">Sun JDK提供的HotSpot JVM就能支持增量式GC。HotSpot JVM缺省GC方式为不使用增量GC，为了启动增量GC，我们必须在运行Java程序时增加-Xincgc的参数。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">HotSpot JVM增量式GC的实现是采用Train GC算法，它的基本想法就是：将堆中的所有对象按照创建和使用情况进行分组（分层），将使用频繁高和具有相关性的对象放在一队中，随着程序的运行，不断对组进行调整。当GC运行时，它总是先回收最老的（最近很少访问的）的对象，如果整组都为可回收对象，GC将整组回收。这样，每次GC运行只回收一定比例的不可达对象，保证程序的顺畅运行。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "><strong>六、详解<span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">函数</span>finalize</strong></span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">finalize 是位于Object类的一个方法，详见我的开源项目：<a target=_blank target="_blank" href="http://code.google.com/p/jdk-java/source/browse/trunk/src-jdk1.7.0_02/java/lang/Object.java">src-jdk1.7.0_02</a></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span class="kwd" style="color: rgb(0, 0, 136); font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; ">    protected</span><span class="pln" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; "> </span><span class="kwd" style="color: rgb(0, 0, 136); font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; ">void</span><span class="pln" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; "> finalize</span><span class="pun" style="color: rgb(102, 102, 0); font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; ">()</span><span class="pln" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; "> </span><span class="kwd" style="color: rgb(0, 0, 136); font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; ">throws</span><span class="pln" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; "> </span><span class="typ" style="color: rgb(102, 0, 102); font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; ">Throwable</span><span class="pln" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; "> </span><span class="pun" style="color: rgb(102, 102, 0); font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; ">{</span><span class="pln" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; "> </span><span class="pun" style="color: rgb(102, 102, 0); font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; white-space: pre-wrap; ">}</span><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">该方法的访问修饰符为protected，由于所有类为Object的子类，因此用户类很容易访问到这个方法。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">由于，finalize函数没有自动实现链式调用，我们必须手动的实现，因此finalize函数的最后一个语句通常是 super.finalize（）。通过这种方式，我们可以实现从下到上实现finalize的调用，即先释放自己的资源，然后再释放父类的资源。根据Java语言规范，JVM保证调用finalize函数之前，这个对象是不可达的，但是JVM不保证这个函数一定会被调用。另外，规范还保证finalize函数最多运行一次。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">很多Java初学者会认为这个方法类似与<span style="line-height: 22px;">C++</span>中的析构函数，将很多对象、资源的释放都放在这一函数里面。其实，这不是一种很好的方式，原因有三：</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">其一<span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">、</span>GC为了能够支持finalize函数，要对覆盖这个函数的对象作很多附加的工作。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">其二、在finalize运行完成之后，该对象可能变成可达的，GC还要再检查一次该对象是否是可达的。因此，使用 finalize会降低GC的运行性能。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">其三<span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">、</span>由于GC调用finalize的时间是不确定的，因此通过这种方式释放资源也是不确定的。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">通常，finalize用于一些不容易控制、并且非常重要资源的释放，例如一些I/O的操作，数据的连接。这些资源的释放对整个应用程序是非常关键的。在这种情况下，程序员应该以通过程序本身管理（包括释放）这些资源为主，以finalize函数释放资源方式为辅，形成一种双保险的管理机制，而不应该仅仅依靠finalize来释放资源。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">下面给出一个例子说明，finalize函数被调用以后，仍然可能是可达的，同时也可说明一个对象的finalize只可能运行一次。</p><p></p><pre name="code" class="java">	class MyObject {
		Test main; 		// 记录Test对象，在finalize中时用于恢复可达性

		public MyObject(Test t) {
			main = t; 	// 保存Test 对象
		}

		protected void finalize() {
			main.ref = this;	// 恢复本对象，让本对象可达
			System.out.println(&quot;This is finalize&quot;);		// 用于测试finalize只运行一次
		}
	}

	class Test {
		MyObject ref;

		public static void main(String[] args) {
			Test test = new Test();
			test.ref = new MyObject(test);
			test.ref = null; 	// MyObject对象为不可达对象，finalize将被调用
			System.gc();
			if (test.ref != null)
				System.out.println(&quot;My Object还活着&quot;);
		}
	}</pre><p></p><p><strong>运行结果：</strong></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; text-align: left; "><span style="color:#000099;">　　This is finalize</span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="color:#000099;"><span style="white-space:pre"><span style="font-family: 宋体; font-size: 14px; text-align: left; ">　　</span></span>My Object还活着</span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">此例子中需要注意，虽然MyObject对象在finalize中变成可达对象，但是下次回收时候，finalize却不再被调用，因为finalize函数最多只调用一次。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "><strong>七、GC程序交互</strong></span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; ">程序如何与GC进行交互呢？&nbsp;</span>Java2增强了内存管理功能，增加了一个java.lang.ref包，详见我的开源项目：<a target=_blank target="_blank" href="http://code.google.com/p/jdk-java/source/browse/trunk/#trunk%2Fsrc-jdk1.7.0_02%2Fjava%2Flang%2Fref">src-jdk1.7.0_02</a></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">其中定义了三种引用类。这三种引用类分别为：SoftReference、 WeakReference、 PhantomReference</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">通过使用这些引用类，程序员可以在一定程度与GC进行交互，以便改善GC的工作效率，这些引用类的引用强度介于可达对象和不可达对象之间。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">创建一个引用对象也非常容易，例如：如果你需要创建一个Soft Reference对象，那么首先创建一个对象，并采用普通引用方式（可达对象）；然后再创建一个SoftReference引用该对象；最后将普通引用设置为null。通过这种方式，这个对象就只有一个Soft Reference引用。同时，我们称这个对象为Soft Reference 对象。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">Soft Reference的主要特点是据有较强的引用功能。只有当内存不够的时候，才进行回收这类内存，因此在内存足够的时候，它们通常不被回收。另外，这些引用对象还能保证在Java抛出OutOfMemory 异常之前，被设置为null。它可以用于实现一些常用图片的缓存，实现Cache的功能，保证最大限度的使用内存而不引起OutOfMemory。以下给出这种引用类型的使用伪代码：</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "></p><pre name="code" class="java">		// 申请一个图像对象
	　　Image image=new Image();		// 创建Image对象
	　　…
	　　// 使用 image
	　　…
	　　// 使用完了image，将它设置为soft 引用类型，并且释放强引用；
	　　SoftReference sr=new SoftReference(image);
	　　image=null;
	　　…
	　　// 下次使用时
	　　if (sr!=null) 
			image=sr.get();
	　　else{
	　　		image=new Image();	//由于GC由于低内存，已释放image，因此需要重新装载；
	　　		sr=new SoftReference(image);
	　　}</pre><p></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">Weak引用对象与Soft引用对象的最大不同就在于：GC在进行回收时，需要通过算法检查是否回收Soft引用对象，而对于Weak引用对象，GC总是进行回收。Weak引用对象更容易、更快被GC回收。虽然，GC在运行时一定回收Weak对象，但是复杂关系的Weak对象群常常需要好几次GC的运行才能完成。Weak引用对象常常用于Map结构中，引用数据量较大的对象，一旦该对象的强引用为null时，GC能够快速地回收该对象空间。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">Phantom引用的用途较少，主要用于辅助finalize函数的使用。Phantom对象指一些对象，它们执行完了finalize函数，并为不可达对象，但是它们还没有被GC回收。这种对象可以辅助finalize进行一些后期的回收工作，我们通过覆盖Reference的clear()方法，增强资源回收机制的灵活性。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><br /></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; "><strong>八、Java编程建议</strong></span></p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">根据GC的工作原理，我们可以通过一些技巧和方式，让GC运行更加有效率，更加符合应用程序的要求。一些关于程序设计的几点建议：</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">1）最基本的建议就是尽早释放无用对象的引用。大多数程序员在使用临时变量的时候，都是让引用变量在退出活动域（scope）后，自动设置为 null.我们在使用这种方式时候，必须特别注意一些复杂的对象图，例如数组，队列，树，图等，这些对象之间有相互引用关系较为复杂。对于这类对象，GC 回收它们一般效率较低。如果程序允许，尽早将不用的引用对象赋为null，这样可以加速GC的工作。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">2）</span>尽量少用finalize函数。finalize函数是Java提供给程序员一个释放对象或资源的机会。但是，它会加大GC的工作量，因此尽量少采用finalize方式回收资源。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">3）</span>如果需要使用经常使用的图片，可以使用soft应用类型。它可以尽可能将图片保存在内存中，供程序调用，而不引起OutOfMemory.</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">4）</span>注意集合数据类型，包括数组，树，图，链表等数据结构，这些数据结构对GC来说，回收更为复杂。另外，注意一些全局的变量，以及一些静态变量。这些变量往往容易引起悬挂对象（dangling reference），造成内存浪费。</p><p style="margin-top: 10px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; word-wrap: break-word; font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; "><span style="font-family: 宋体; font-size: 14px; line-height: 25px; text-align: left; ">5）</span>当程序有一定的等待时间，程序员可以手动执行System.gc()，通知GC运行，但是Java语言规范并不保证GC一定会执行。使用增量式GC可以缩短Java程序的暂停时间。</p><br /><p><br /></p><p></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><strong><span style="color:#ff0000;">参考推荐：</span></strong></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://blog.sina.com.cn/s/blog_4e90b3ba0100m5cb.html">Java内存模型及GC原理</a></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://inotgaoshou.iteye.com/blog/757470">一个优秀的Java程序员必须了解的GC机制</a></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://blog.csdn.net/sunboy_2050/article/details/7538546">Android 智能指针原理</a>（<span style="color:#ff0000;">推荐</span>）</span></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://www.189works.com/article-42350-1.html">Java虚拟机规范</a><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://hi.baidu.com/qust409xls/blog/item/28dd9e26605e6213908f9d0b.html">Java虚拟机参数</a><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://www.cnblogs.com/tiechui/archive/2010/12/07/1898774.html">Java内存模型</a><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://blog.csdn.net/silentbalanceyh">Java系列教程</a>（<span style="color: rgb(255, 0, 0); ">推荐</span>）</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://www.360doc.com/content/11/0911/15/18042_147476260.shtml">Java垃圾回收原理</a>（360doc）</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://blog.csdn.net/zeo112140/article/details/7225277">Java内存模型及GC原理</a>（图解）<br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://blog.csdn.net/autofei/article/details/7456213">Java的内存结构和垃圾收集</a>（图解）</span><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style="font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://blog.csdn.net/sfdev/article/details/4483442">JDK5.0中JVM堆模型、GC垃圾收集详细解析</a>（图解）</span><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://hi.baidu.com/sunboy_2050/blog/item/81c381800ccfe48cf703a6a6.html">Java内存泄露的理解与解决</a><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://blog.csdn.net/remote_roamer/article/details/5539975">Java gc的调用机制和编程规则</a><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://blog.csdn.net/bulinner/article/details/715752">Java 内存泄漏实例及解决方案研究</a><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><br /></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><a target=_blank target="_blank" href="http://news.csdn.net/a/20091222/215973.html">JVM 优点与缺点的深入分析</a>&nbsp;[草稿]</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><br /></p>
</div>



<!-- Baidu Button BEGIN -->
<div id="bdshare" class="bdshare_t bds_tools get-codes-bdshare" style="float: right;">
<a class="bds_qzone"></a>
<a class="bds_tsina"></a>
<a class="bds_tqq"></a>
<a class="bds_renren"></a>
<a class="bds_t163"></a>
<span class="bds_more">更多</span>
<a class="shareCount"></a>
</div>
<!-- Baidu Button END -->


<!--192.168.100.33-->
<div class="article_next_prev">
            <li class="prev_article"><span>上一篇：</span><a href="/ithomer/article/details/6244863" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">RedHat.Enterprise.Linux.5.2 Yum源配置</a></li>
            <li class="next_article"><span>下一篇：</span><a href="/ithomer/article/details/6264881" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian'])">Ubuntu 配置网络命令</a></li>
</div>

<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&amp;uid=1536434" ></script>
<script type="text/javascript" id="bdshell_js"></script>
<script type="text/javascript">
    document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->

        <div id="digg" ArticleId="6252552">
            <dl id="btnDigg" class="digg digg_disable">
                <dt onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_ding'])">顶</dt>
                <dd>3</dd>
            </dl>
            <dl id="btnBury" class="digg digg_disable">
                <dt onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_cai'])">踩</dt>
                <dd>0</dd>
            </dl>
        </div>
</div>
      <dl class="blog-associat-tag">
        <dt>相关主题推荐</dt>
        <dd>
                <a href="http://www.csdn.net/tag/内存" target="_blank">内存</a> 
                <a href="http://www.csdn.net/tag/java" target="_blank">java</a> 
                <a href="http://www.csdn.net/tag/应用程序" target="_blank">应用程序</a> 
                <a href="http://www.csdn.net/tag/内存管理" target="_blank">内存管理</a> 
                <a href="http://www.csdn.net/tag/开源项目" target="_blank">开源项目</a> 
        </dd>
    </dl> 
    <dl class="blog-ass-articl">
        <dt>相关博文推荐</dt>
            <dd>
                <a href="http://blog.csdn.net/aimarcby/article/details/21233751" title="黑马程序员_UDP和TCP简单的通信代码和注释学习笔记" target="_blank">黑马程序员_UDP和TCP简单的通信代码...</a></dd>
            <dd>
                <a href="http://blog.csdn.net/u013951556/article/details/21234563" title="黑马" target="_blank">黑马</a></dd>
            <dd>
                <a href="http://blog.csdn.net/oLeiShen/article/details/21233919" title="java多线程使用（Thread）" target="_blank">java多线程使用（Thread）</a></dd>
            <dd>
                <a href="http://blog.csdn.net/yangxuan0261/article/details/21234115" title="Cocos2dx-内存管理机制（autorelease、release、retain）" target="_blank">Cocos2dx-内存管理机制（auto...</a></dd>
            <dd>
                <a href="http://blog.csdn.net/yangxuan0261/article/details/21233997" title="Cocos2dx-内存管理机制,autorelease , release, retain的使用" target="_blank">Cocos2dx-内存管理机制,auto...</a></dd>
            <dd>
                <a href="http://blog.csdn.net/dingli3213/article/details/21233595" title="安装Eclipse反编译插件" target="_blank">安装Eclipse反编译插件</a></dd>
            <dd>
                <a href="http://blog.csdn.net/yj_2006hn/article/details/21233399" title="java常用开发环境配置" target="_blank">java常用开发环境配置</a></dd>
            <dd>
                <a href="http://blog.csdn.net/myNameIssls/article/details/21233169" title="Java Properties文件解析" target="_blank">Java Properties文件解析</a></dd>
    </dl>

    <div id="ad_cen">
        <script type="text/javascript">            BAIDU_CLB_SLOT_ID = "117306";</script>
        <script type="text/javascript" src="http://cbjs.baidu.com/js/o.js"></script>
    </div>
    <script type="text/javascript">
        //new Ad(4, 'ad_cen');
    </script>
<div id="comment_title" class="panel_head">
    查看评论<a name="comments"></a></div>
<div id="comment_list">
</div>
<div id="comment_bar">
</div>
<div id="comment_form">
</div>
<div class="announce">
    * 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场<a name="reply"></a><a name="quote"></a></div>
<script type="text/javascript">
    var fileName = '6252552';
    var commentscount = 2;
    var islock = false
</script>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/comment.js"></script>
    <div id="ad_bot">
    </div>
    <script type="text/javascript">
    new Ad(5, 'ad_bot');
    </script>
<div id="report_dialog">
</div>
<div id="d-top" style="display: none;">
    <a id="d-top-a" href="#" title="回到顶部" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_huidaodingbu'])">
        <img src="http://static.blog.csdn.net/images/top.png" alt="TOP" /></a>
</div>
<script type="text/javascript">
    $(function ()
    {
        var d_top = $('#d-top');
        document.onscroll = function ()
        {
            var scrTop = (document.body.scrollTop || document.documentElement.scrollTop);
            if (scrTop > 500)
            {
                d_top.show();
            } else
            {
                d_top.hide();
            }
        }
        $('#d-top-a').click(function ()
        {
            scrollTo(0, 0);
            this.blur();
            return false;
        });
    });
  
</script>
<style type="text/css">
    .tag_list
    {
        background: none repeat scroll 0 0 #FFFFFF;
        border: 1px solid #D7CBC1;
        color: #000000;
        font-size: 12px;
        line-height: 20px;
        list-style: none outside none;
        margin: 10px 2% 0 1%;
        padding: 1px;
    }
    .tag_list h5
    {
        background: none repeat scroll 0 0 #E0DBD3;
        color: #47381C;
        font-size: 12px;
        height: 24px;
        line-height: 24px;
        padding: 0 5px;
        margin: 0;
    }
    .tag_list h5 a
    {
        color: #47381C;
    }
    .classify
    {
        margin: 10px 0;
        padding: 4px 12px 8px;
    }
    .classify a
    {
        margin-right: 20px;
        white-space: nowrap;
    }
</style>
<div class="tag_list">
    <h5>
        <a href="http://www.csdn.net/tag/" target="_blank">核心技术类目</a></h5>
    <div class="classify">
<a title="全部主题" href="http://www.csdn.net/tag" target="_blank" onclick="LogClickCount(this,336);">全部主题</a>
<a title="Java" href="http://www.csdn.net/tag/Java" target="_blank" onclick="LogClickCount(this,336);">Java</a>
<a title="VPN" href="http://www.csdn.net/tag/vpn" target="_blank" onclick="LogClickCount(this,336);">VPN</a>
<a title="Android" href="http://www.csdn.net/tag/android" target="_blank" onclick="LogClickCount(this,336);">Android</a>
<a title="iOS" href="http://www.csdn.net/tag/ios" target="_blank" onclick="LogClickCount(this,336);">iOS</a>
<a title="ERP" href="http://www.csdn.net/tag/erp" target="_blank" onclick="LogClickCount(this,336);">ERP</a>
<a title="IE10" href="http://www.csdn.net/tag/ie10" target="_blank" onclick="LogClickCount(this,336);">IE10</a>
<a title="Eclipse" href="http://www.csdn.net/tag/eclipse" target="_blank" onclick="LogClickCount(this,336);">Eclipse</a>
<a title="CRM" href="http://www.csdn.net/tag/crm" target="_blank" onclick="LogClickCount(this,336);">CRM</a>
<a title="JavaScript" href="http://www.csdn.net/tag/javascript" target="_blank" onclick="LogClickCount(this,336);">JavaScript</a>
<a title="Ubuntu" href="http://www.csdn.net/tag/ubuntu" target="_blank" onclick="LogClickCount(this,336);">Ubuntu</a>
<a title="NFC" href="http://www.csdn.net/tag/nfc" target="_blank" onclick="LogClickCount(this,336);">NFC</a>
<a title="WAP" href="http://www.csdn.net/tag/wap" target="_blank" onclick="LogClickCount(this,336);">WAP</a>
<a title="jQuery" href="http://www.csdn.net/tag/jquery" target="_blank" onclick="LogClickCount(this,336);">jQuery</a>
<a title="数据库" href="http://www.csdn.net/tag/数据库" target="_blank" onclick="LogClickCount(this,336);">数据库</a>
<a title="BI" href="http://www.csdn.net/tag/bi" target="_blank" onclick="LogClickCount(this,336);">BI</a>
<a title="HTML5" href="http://www.csdn.net/tag/html5" target="_blank" onclick="LogClickCount(this,336);">HTML5</a>
<a title="Spring" href="http://www.csdn.net/tag/spring" target="_blank" onclick="LogClickCount(this,336);">Spring</a>
<a title="Apache" href="http://www.csdn.net/tag/apache" target="_blank" onclick="LogClickCount(this,336);">Apache</a>
<a title="Hadoop" href="http://www.csdn.net/tag/hadoop" target="_blank" onclick="LogClickCount(this,336);">Hadoop</a>
<a title=".NET" href="http://www.csdn.net/tag/.net" target="_blank" onclick="LogClickCount(this,336);">.NET</a>
<a title="API" href="http://www.csdn.net/tag/api" target="_blank" onclick="LogClickCount(this,336);">API</a>
<a title="HTML" href="http://www.csdn.net/tag/html" target="_blank" onclick="LogClickCount(this,336);">HTML</a>
<a title="SDK" href="http://www.csdn.net/tag/sdk" target="_blank" onclick="LogClickCount(this,336);">SDK</a>
<a title="IIS" href="http://www.csdn.net/tag/iis" target="_blank" onclick="LogClickCount(this,336);">IIS</a>
<a title="Fedora" href="http://www.csdn.net/tag/fedora" target="_blank" onclick="LogClickCount(this,336);">Fedora</a>
<a title="XML" href="http://www.csdn.net/tag/xml" target="_blank" onclick="LogClickCount(this,336);">XML</a>
<a title="LBS" href="http://www.csdn.net/tag/lbs" target="_blank" onclick="LogClickCount(this,336);">LBS</a>
<a title="Unity" href="http://www.csdn.net/tag/unity" target="_blank" onclick="LogClickCount(this,336);">Unity</a>
<a title="Splashtop" href="http://www.csdn.net/tag/splashtop" target="_blank" onclick="LogClickCount(this,336);">Splashtop</a>
<a title="UML" href="http://www.csdn.net/tag/uml" target="_blank" onclick="LogClickCount(this,336);">UML</a>
<a title="components" href="http://www.csdn.net/tag/components" target="_blank" onclick="LogClickCount(this,336);">components</a>
<a title="Windows Mobile" href="http://www.csdn.net/tag/windowsmobile" target="_blank" onclick="LogClickCount(this,336);">Windows Mobile</a>
<a title="Rails" href="http://www.csdn.net/tag/rails" target="_blank" onclick="LogClickCount(this,336);">Rails</a>
<a title="QEMU" href="http://www.csdn.net/tag/qemu" target="_blank" onclick="LogClickCount(this,336);">QEMU</a>
<a title="KDE" href="http://www.csdn.net/tag/kde" target="_blank" onclick="LogClickCount(this,336);">KDE</a>
<a title="Cassandra" href="http://www.csdn.net/tag/cassandra" target="_blank" onclick="LogClickCount(this,336);">Cassandra</a>
<a title="CloudStack" href="http://www.csdn.net/tag/cloudstack" target="_blank" onclick="LogClickCount(this,336);">CloudStack</a>
<a title="FTC" href="http://www.csdn.net/tag/ftc" target="_blank" onclick="LogClickCount(this,336);">FTC</a>
<a title="coremail" href="http://www.csdn.net/tag/coremail" target="_blank" onclick="LogClickCount(this,336);">coremail</a>
<a title="OPhone " href="http://www.csdn.net/tag/ophone " target="_blank" onclick="LogClickCount(this,336);">OPhone </a>
<a title="CouchBase" href="http://www.csdn.net/tag/couchbase" target="_blank" onclick="LogClickCount(this,336);">CouchBase</a>
<a title="云计算" href="http://www.csdn.net/tag/云计算" target="_blank" onclick="LogClickCount(this,336);">云计算</a>
<a title="iOS6" href="http://www.csdn.net/tag/iOS6" target="_blank" onclick="LogClickCount(this,336);">iOS6</a>
<a title="Rackspace " href="http://www.csdn.net/tag/rackspace " target="_blank" onclick="LogClickCount(this,336);">Rackspace </a>
<a title="Web App" href="http://www.csdn.net/tag/webapp" target="_blank" onclick="LogClickCount(this,336);">Web App</a>
<a title="SpringSide" href="http://www.csdn.net/tag/springside" target="_blank" onclick="LogClickCount(this,336);">SpringSide</a>
<a title="Maemo" href="http://www.csdn.net/tag/maemo" target="_blank" onclick="LogClickCount(this,336);">Maemo</a>
<a title="Compuware" href="http://www.csdn.net/tag/compuware" target="_blank" onclick="LogClickCount(this,336);">Compuware</a>
<a title="大数据" href="http://www.csdn.net/tag/大数据" target="_blank" onclick="LogClickCount(this,336);">大数据</a>
<a title="aptech" href="http://www.csdn.net/tag/aptech" target="_blank" onclick="LogClickCount(this,336);">aptech</a>
<a title="Perl" href="http://www.csdn.net/tag/perl" target="_blank" onclick="LogClickCount(this,336);">Perl</a>
<a title="Tornado" href="http://www.csdn.net/tag/tornado" target="_blank" onclick="LogClickCount(this,336);">Tornado</a>
<a title="Ruby" href="http://www.csdn.net/tag/ruby" target="_blank" onclick="LogClickCount(this,336);">Ruby</a>
<a title="Hibernate" href="http://www.csdn.net/hibernate" target="_blank" onclick="LogClickCount(this,336);">Hibernate</a>
<a title="ThinkPHP" href="http://www.csdn.net/tag/thinkphp" target="_blank" onclick="LogClickCount(this,336);">ThinkPHP</a>
<a title="Spark" href="http://www.csdn.net/tag/spark" target="_blank" onclick="LogClickCount(this,336);">Spark</a>
<a title="HBase" href="http://www.csdn.net/tag/hbase" target="_blank" onclick="LogClickCount(this,336);">HBase</a>
<a title="Pure" href="http://www.csdn.net/tag/pure" target="_blank" onclick="LogClickCount(this,336);">Pure</a>
<a title="Solr" href="http://www.csdn.net/tag/solr" target="_blank" onclick="LogClickCount(this,336);">Solr</a>
<a title="Angular" href="http://www.csdn.net/tag/angular" target="_blank" onclick="LogClickCount(this,336);">Angular</a>
<a title="Cloud Foundry" href="http://www.csdn.net/tag/cloudfoundry" target="_blank" onclick="LogClickCount(this,336);">Cloud Foundry</a>
<a title="Redis" href="http://www.csdn.net/tag/redis" target="_blank" onclick="LogClickCount(this,336);">Redis</a>
<a title="Scala" href="http://www.csdn.net/tag/scala" target="_blank" onclick="LogClickCount(this,336);">Scala</a>
<a title="Django" href="http://www.csdn.net/tag/django" target="_blank" onclick="LogClickCount(this,336);">Django</a>
<a title="Bootstrap" href="http://www.csdn.net/tag/bootstrap" target="_blank" onclick="LogClickCount(this,336);">Bootstrap</a>
    </div>
</div>

                    <div class="clear">
                    </div>
                </div>
            </div>
            <div id="side">
    <div class="side">
<div id="panel_Profile" class="panel">
<ul class="panel_head"><span>个人资料</span></ul>
<ul class="panel_body profile">
<div id="blog_userface">
    <a href="http://my.csdn.net/sunboy_2050" target="_blank">
    <img src="http://avatar.csdn.net/C/6/F/1_sunboy_2050.jpg" title="访问我的空间" style="max-width:90%"/>
    </a>
    <br />
    <span><a href="http://my.csdn.net/sunboy_2050" class="user_name" target="_blank">sunboy_2050</a></span>
</div>
<div class="interact">
<a href="javascript:void(0);" class="attent" id="span_add_follow" title="[加关注]" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_guanzhu'])"></a>
<a href="javascript:void(0);" class="letter" onclick="loginto(1)" title="[发私信]" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_sixin'])"></a>
</div>
<div id="blog_medal">
        <div class="ico_expert" title="CSDN认证专家"></div>
</div>
<ul id="blog_rank">
    <li>访问：<span>4723181次</span></li>
    <li>积分：<span>42818分</span></li>
    <li>排名：<span>第22名</span></li>
</ul>
<ul id="blog_statistics">
    <li>原创：<span>592篇</span></li>
    <li>转载：<span>218篇</span></li>
    <li>译文：<span>14篇</span></li>
    <li>评论：<span>2392条</span></li>
</ul>
</ul>
</div>


<div id="custom_column_21039684" class="panel">
<ul class="panel_head"><span>学习经历</span></ul>
<ul class="panel_body">
<div style="margin-top: 2px; margin-bottom: 5px; color: #000000; line-height:24px;">
 中科院、百度、创新工场、小米
<br>
系统架构设计师（2013）
<br>
软件设计师（2008）

<!--
<a target="_blank" href="http://www.csdn.net/article/2013-01-21/2813843"><font color="blue">CSDN创业专访</font></a>
-->


<br>
<br>
<b>
<font color="#FF1493">
程序人生的平凡生活
</font><br>
QQ群：
<a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=e01accc253cf07c5461fb3982376c52697c47bd0a77b700c4c54c8d85cad79e3">
<font color="red">282297696</font></a>
</b>（已满）
<br>
汇聚百度、小米、微软、腾讯、<br>
创新工场、阿里巴巴、日本雅虎




<br>
<br>
<b>
<font color="#FF1493">
程序员创业邦
</font><br>
QQ群：
<a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=e035a782424d40dd579686246911532bf14fa0529506e15c9a967538a6595971">
<font color="red">239292073</font></a>
<br></b>
青春，每一个有梦想的人



<br>
<br>
<b>
<font color="#FF1493">
爱脚本，爱技术
</font><br>
QQ群：
<a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=0c37d52f358651d34be98faf0ed1f08ab0b29388ca545c27e3780f31c5ecdda5">
<font color="red">320296250</font></a>
<br></b>
python、ruby、awk、shell





<br>
<br>
<b>
<font color="#FF1493">
资深产品经理人
</font><br>
QQ群：
<a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=c482e21de6e77a16560a8a790c907ce86cf59799476e52e611b8e0f9f8f88879">
<font color="red">338142405</font></a>
<br></b>
思与行，人人都是产品经理





</div>
</ul>
</div><div id="custom_column_27131963" class="panel">
<ul class="panel_head"><span>微信公众号：ithomer</span></ul>
<ul class="panel_body">
<div style="line-height: 24px;">

<div>
<a target="_blank" href="http://blog.ithomer.net">
<img src="http://img.my.csdn.net/uploads/201401/26/1390701376_9741.jpg" width="180" height="180">
</a>
</div>

<div style="text-align: center; ">
<a target="_blank" href="http://blog.ithomer.net"><font color="blue">
<b>ithomer</b>：传播光和热的正能量！
</font></a>
</div>

</div>
</ul>
</div><div id="custom_column_26666015" class="panel">
<ul class="panel_head"><span>个人博客</span></ul>
<ul class="panel_body">
<div style="line-height:24px;">

<a target="_blank" href="http://blog.ithomer.net"><img src="http://img.my.csdn.net/uploads/201310/16/1381938557_1134.png" width="175" height="87" title="点击图片，进入技术博客" alt="点击，进入技术博客"></a>

<br><br>

 <font color="black"> 新博客：</font><a href="http://blog.ithomer.net" target="_blank"><font color="blue"><u>http://blog.ithomer.net</u></font></a>

<br><br>
本CSDN博客，近期会全部移到我的独立博客；
脚本转换工具，也会开源出来，感谢大家关注。

<!--
<br>
<div style="height:8px;"></div>
 <font color="red"> 论坛</font>：<a href="http://forum.ithomer.net" target="_blank"><font color="blue"><u>forum.ithomer.net</u></font></a>
-->


<!--
<br>
<br>
<b>
<font color="#FF1493">
爱黑客，爱技术
</font><br>
QQ交流群：
<a href="http://shang.qq.com/wpa/qunwpa?idkey=a30763a40af51c4bdd330c63295957807f3c237cf15068b832da01b9812a6caa">
<font color="red">320296250</font></a>
<br></b>
python、ruby、awk、shell


<br>
<br>
<b>
<font color="#FF1493">
程序人生的平凡生活
</font><br>
QQ交流群：
<a href="http://shang.qq.com/wpa/qunwpa?idkey=d9b2709ee7786771e5e6487b38e5f184c221544ed85d80323f208f160354d8d5">
<font color="red">282297696</font></a>
<br></b>
汇聚百度、小米、微软、腾讯、<br>
创新工场、阿里巴巴、日本雅虎
<div style="height:5px;">
-->



<!--
<br><br>
<b><font color="#FF1493">
微信公众账号：
</font></b>
<br>
<a href="http://www.ithomer.net" target="_blank">
<img src="http://img.my.csdn.net/uploads/201401/26/1390701376_9741.jpg" width="180" height="180">
</a>
-->


</div>
</ul>
</div><div id="panel_Category" class="panel">
    <ul class="panel_head"><span>博客专栏</span></ul>
    <ul class="panel_body" id="sp_column">
    <table cellpadding="0" cellspacing="0"><tr>
    <td style="padding:10px 10px 0 0;">
    <a href="http://blog.csdn.net/column/details/learn-clojure.html" target="_blank"><img src="http://avatar.csdn.net/blogpic/20131230144109281.jpg" style="width:75px;height:75px;" /></a>
    </td>
    <td style="padding:10px 0; vertical-align:top;">
    <a href="http://blog.csdn.net/column/details/learn-clojure.html" target="_blank">Clojure 学习总结</a>
    <p>文章：17篇</p>
    <span>阅读：76273</span>
    </td>
    </tr></table>
    <table cellpadding="0" cellspacing="0"><tr>
    <td style="padding:10px 10px 0 0;">
    <a href="http://blog.csdn.net/column/details/python-learning.html" target="_blank"><img src="http://avatar.csdn.net/blogpic/20131211091935593.jpg" style="width:75px;height:75px;" /></a>
    </td>
    <td style="padding:10px 0; vertical-align:top;">
    <a href="http://blog.csdn.net/column/details/python-learning.html" target="_blank">Python 学习入门</a>
    <p>文章：49篇</p>
    <span>阅读：195909</span>
    </td>
    </tr></table>
    <table cellpadding="0" cellspacing="0"><tr>
    <td style="padding:10px 10px 0 0;">
    <a href="http://blog.csdn.net/column/details/design-pattern-homer.html" target="_blank"><img src="http://avatar.csdn.net/blogpic/20120425223438759.jpg" style="width:75px;height:75px;" /></a>
    </td>
    <td style="padding:10px 0; vertical-align:top;">
    <a href="http://blog.csdn.net/column/details/design-pattern-homer.html" target="_blank">设计模式</a>
    <p>文章：3篇</p>
    <span>阅读：37993</span>
    </td>
    </tr></table>
    <table cellpadding="0" cellspacing="0"><tr>
    <td style="padding:10px 10px 0 0;">
    <a href="http://blog.csdn.net/column/details/androidboy.html" target="_blank"><img src="http://avatar.csdn.net/blogpic/20120328224350711.jpg" style="width:75px;height:75px;" /></a>
    </td>
    <td style="padding:10px 0; vertical-align:top;">
    <a href="http://blog.csdn.net/column/details/androidboy.html" target="_blank">Android开发的点点滴滴</a>
    <p>文章：32篇</p>
    <span>阅读：1235447</span>
    </td>
    </tr></table>
    </ul>
</div><div id="custom_column_20758878" class="panel">
<ul class="panel_head"><span>博客公告</span></ul>
<ul class="panel_body">
<div style="line-height:24px;">
<font color="red"><strong>本博客内容，由本人精心整理</strong><br>
欢迎交流，欢迎转载，大家转载注明出处，禁止用于商业目的。</font><br>

</div>
</ul>
</div><div class="panel" id="panel_Search">
    <ul class="panel_head"><span>文章搜索</span></ul>
    <ul class="panel_body">
        <form id="frmSearch" action="http://so.csdn.net/search" class="form_search" target="_blank">
        <span><input id="inputSearch" type="text" class="blogsearch" title="请输入关键字" /></span>
        <input id="btnSubmit" type="submit" value="搜索" title="search in blog" />
        <input type="hidden" name="q" id="inputQ" />
        <input type="hidden" name="t" value="blog" />
        <a id="btnSearchBlog" target="_blank"></a>
        </form>
    </ul>
</div><div id="panel_Category" class="panel">
<ul class="panel_head"><span>文章分类</span></ul>
<ul class="panel_body">
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/694821" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Algorithm</a><span>(85)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/600130" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">C/C++/C#</a><span>(114)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/655460" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Linux/Shell</a><span>(139)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/809006" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">QT</a><span>(13)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/694817" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Script</a><span>(132)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/698436" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">NetWork</a><span>(21)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/581634" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">SQL Index</a><span>(62)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/708773" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">SoftWare</a><span>(33)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/730435" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Java/JSP</a><span>(46)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/632423" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Learn</a><span>(51)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/632431" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">IT Trend</a><span>(56)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/853274" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Android</a><span>(96)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/1398664" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Cloud</a><span>(11)</span>
            </li>
             <li>
                <a href="http://blog.csdn.net/ithomer/article/category/1256697" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">iOS</a><span>(4)</span>
            </li>
</ul>
</div><div id="panel_Archive" class="panel">
<ul class="panel_head"><span>文章存档</span></ul>
<ul class="panel_body">
<div id="archive_list">
<!--归档统计-->
<li><a href="http://blog.csdn.net/ithomer/article/month/2014/03">2014年03月</a><span>(4)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2014/02">2014年02月</a><span>(2)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2014/01">2014年01月</a><span>(8)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/12">2013年12月</a><span>(45)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/11">2013年11月</a><span>(13)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/10">2013年10月</a><span>(20)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/09">2013年09月</a><span>(18)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/08">2013年08月</a><span>(20)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/07">2013年07月</a><span>(16)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/06">2013年06月</a><span>(11)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/05">2013年05月</a><span>(20)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/04">2013年04月</a><span>(50)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/03">2013年03月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/02">2013年02月</a><span>(11)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2013/01">2013年01月</a><span>(11)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/12">2012年12月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/11">2012年11月</a><span>(15)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/10">2012年10月</a><span>(12)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/09">2012年09月</a><span>(15)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/08">2012年08月</a><span>(16)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/07">2012年07月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/06">2012年06月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/05">2012年05月</a><span>(14)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/04">2012年04月</a><span>(16)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/03">2012年03月</a><span>(16)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/02">2012年02月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2012/01">2012年01月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/12">2011年12月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/11">2011年11月</a><span>(12)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/10">2011年10月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/09">2011年09月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/08">2011年08月</a><span>(12)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/07">2011年07月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/06">2011年06月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/05">2011年05月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/04">2011年04月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/03">2011年03月</a><span>(10)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/02">2011年02月</a><span>(11)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2011/01">2011年01月</a><span>(12)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/12">2010年12月</a><span>(15)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/11">2010年11月</a><span>(15)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/10">2010年10月</a><span>(31)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/09">2010年09月</a><span>(17)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/08">2010年08月</a><span>(16)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/07">2010年07月</a><span>(12)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/06">2010年06月</a><span>(45)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/05">2010年05月</a><span>(16)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/04">2010年04月</a><span>(6)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/03">2010年03月</a><span>(9)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/02">2010年02月</a><span>(12)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2010/01">2010年01月</a><span>(27)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2009/12">2009年12月</a><span>(53)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2009/09">2009年09月</a><span>(2)</span></li><li><a href="http://blog.csdn.net/ithomer/article/month/2009/08">2009年08月</a><span>(11)</span></li>
</div>
</ul>
</div>
<div id="hotarticls" class="panel">
<ul class="panel_head"><span>阅读排行</span></ul>
<ul class="panel_body itemlist">
<li>
<a href="/ithomer/article/details/6727581" title="Android APK反编译详解（附图）">Android APK反编译详解（附图）</a><span>(531352)</span>
</li>
<li>
<a href="/ithomer/article/details/6187464" title="SVN常用命令">SVN常用命令</a><span>(132397)</span>
</li>
<li>
<a href="/ithomer/article/details/6688883" title="Android 获取屏幕尺寸与密度">Android 获取屏幕尺寸与密度</a><span>(130961)</span>
</li>
<li>
<a href="/ithomer/article/details/6960989" title="Ubuntu搭建Eclipse+JDK+SDK的Android">Ubuntu搭建Eclipse+JDK+SDK的Android</a><span>(103654)</span>
</li>
<li>
<a href="/ithomer/article/details/7635301" title="Linux 抓取网页实例（shell+awk）">Linux 抓取网页实例（shell+awk）</a><span>(97417)</span>
</li>
<li>
<a href="/ithomer/article/details/6336480" title="Windows搭建Eclipse+JDK+SDK的Android">Windows搭建Eclipse+JDK+SDK的Android</a><span>(88819)</span>
</li>
<li>
<a href="/ithomer/article/details/5645831" title="各种基本算法实现小结（五）—— 排序算法">各种基本算法实现小结（五）—— 排序算法</a><span>(86372)</span>
</li>
<li>
<a href="/ithomer/article/details/7497435" title="Android 创建与解析XML（一）—— 概述">Android 创建与解析XML（一）—— 概述</a><span>(85640)</span>
</li>
<li>
<a href="/ithomer/article/details/6727640" title="Android如何防止apk程序被反编译">Android如何防止apk程序被反编译</a><span>(57699)</span>
</li>
<li>
<a href="/ithomer/article/details/7973957" title="去360还是留百度？">去360还是留百度？</a><span>(54797)</span>
</li>
</ul>
</div>
    </div>
    <div class="clear">
    </div>
</div>

            <div class="clear">
            </div>
        </div>
        

<script type="text/javascript" src="http://static.blog.csdn.net/scripts/newblog.min.js"></script>
<script type="text/javascript" src="http://medal.blog.csdn.net/showblogmedal.ashx?blogid=638783"></script>
<script type="text/javascript">
    document.write('<script type="text/javascript" src="http://csdnimg.cn/pubfooter/js/publib_footer.js?' + Math.floor(new Date() / 120000).toString(36) + '="></' + 'script>');
</script>
    <script type="text/javascript" src="http://passport.csdn.net/content/loginbox/login.js"></script>
    <script type="text/javascript" src="http://js.tongji.linezing.com/2955225/tongji.js"></script>
<script type="text/javascript">document.write("<img src=http://counter.csdn.net/pv.aspx?id=24 border=0 width=0 height=0>");</script>
<script type="text/javascript" src="http://www.csdn.net/ui/scripts/Csdn/counter.js"></script>
<script type="text/javascript" src="http://ad.csdn.net/scripts/ad-blog.js"></script>
<script type="text/javascript" src="http://zz.csdn.net/js/count.js"></script>
<script type="text/javascript">
    $(function () {
        function __get_code_toolbar(snippet_id) {
            return $("<a href='https://code.csdn.net/snippets/"
                    + snippet_id
                    + "' target='_blank' title='在CODE上查看代码片' style='text-indent:0;'><img src='https://code.csdn.net/assets/CODE_ico.png' width=12 height=12 alt='在CODE上查看代码片' style='position:relative;top:1px;left:2px;'/></a>"
                    + "<a href='https://code.csdn.net/snippets/"
                    + snippet_id
                    + "/fork' target='_blank' title='派生到我的代码片'  style='text-indent:0;'><img src='https://code.csdn.net/assets/ico_fork.svg' width=12 height=12 alt='派生到我的代码片' style='position:relative;top:2px;left:2px;'/></a>");
        }
        
        $("[code_snippet_id]").each(function () {
            __s_id = $(this).attr("code_snippet_id");
            if (__s_id != null && __s_id != "" && __s_id != 0 && parseInt(__s_id) > 70020) {
                __code_tool = __get_code_toolbar(__s_id);
                $(this).prev().find(".tools").append(__code_tool);
            }
        });
    });
</script>

    </div>
      <!--new top-->
    
    <script id="csdn-toolbar-id" btnId="header_notice_num" wrapId="note1" count="5" subCount="5" type="text/javascript" src="http://static.csdn.net/public/common/toolbar/js/toolbar.js"></script>     <!--new top-->
</body>
</html>
